Управління оперативною пам`яттю

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Волзький Університет імені В. Н. Татіщева
Факультет «Інформатики та телекомунікацій»
Кафедра «Інформатика та системи управління»
Курсова робота
з дисципліни:
"Основи програмного забезпечення"
на тему:
"Управління оперативною пам'яттю"

Зміст
Введення
1. Аналітичний розділ
1.1 Визначення
1.2 Принципи управління та розподілу оперативної пам'яті
2. Розробка алгоритму керування оперативною пам'яттю
Висновок
Список використаної літератури

Введення
В даний час існують безліч операційних програм, які в достатній мірі ефективності і надійності, управляють оперативною пам'яттю. До таких систем можна віднести Windows, Unix і т.д. Прогрес електроніки привів до значного поліпшення елементів пам'яті. А саме таких параметрів, модулів пам'яті, як обсяг, надійність, оперативність і компактність. Пам'ять застосовується скрізь, де є елемент, що обробляє інформацію (процесор, контролер). В наслідок цього, з'явилися нові, більш потужні системи управління здатні використовувати ресурси оперативної пам'яті. Це призвело до збільшення швидкості обробки інформації і до збільшення потужності програмних засобів і отже самої потужності, всього комп'ютера в цілому. Наприклад, підсистема управління оперативною пам'яттю MS-DOS базувалася на використанні блоків управління пам'яттю MCB. Таке "управління" пам'яттю повністю засноване на джентльменському угоді між програмами про збереження цілісності операційної системи, так як будь-яка програма може записати дані по будь-якою адресою. Програма може легко зруйнувати системні області MS-DOS або векторну таблицю переривань. На сьогоднішній день існує додаток Windows, яке виконується в захищеному режимі, тому воно не може адресуватися до будь-яких областей пам'яті. Це сильно підвищує надійність операційної системи.
Мета курсової роботи полягає у вивченні функціонування і взаємодія операційної системи з оперативною пам'яттю. Так само буде виконано аналіз основних типів, параметрів оперативної пам'яті застосовуються в системних платах персонального комп'ютера. Далі буде представлена ​​програмна частина з обробкою і ходом виконання команд і розміщення в оперативній пам'яті.

1. Аналітичний розділ
1.1 Визначення
Оперативна (або робоча) пам'ять комп'ютера - ОЗУ (Оперативне Запам'ятовуючий Пристрій) - зібрана на напівпровідникових кристалах (чіпах - chip) і зберігає інформацію, тільки поки комп'ютер включений. При вимиканні харчування її вміст губиться. Іноді, цю пам'ять називають ще пам'яттю з довільним доступом. (Random Access Memory - RAM).
Всю пам'ять з довільним доступом (RAM) можна розділити на два типи:
1. DRAM (динамічна RAM)
2. SRAM (статична RAM).

Пам'ять типу DRAM

Динамічна оперативна пам'ять (Dynamic RAM - DRAM) використовується в більшості систем оперативної пам'яті персональних комп'ютерів. Основна перевага цього типу пам'яті полягає в тому, що її осередки інтегровані щільно, тобто в невелику мікросхему можна помістити безліч бітів, а значить, на їх основі можна побудувати пам'ять більшої ємності.
Комірки пам'яті в мікросхемі DRAM - це крихітні конденсатори, які утримують заряди. Проблеми, пов'язані з пам'яттю цього типу, викликані тим, що вона динамічна, тобто повинна постійно регенеруватися, тому що в противному випадку електричні заряди в конденсаторах пам'яті будуть "стікати", і дані будуть втрачені. Регенерація відбувається, коли контролер пам'яті системи бере крихітна перерва і звертається до всіх рядків даних в мікросхемах пам'яті. Більшість систем має контролер пам'яті (зазвичай вбудовуваний в набір мікросхем системної плати), який налаштований на відповідну промисловим стандартам частоту регенерації, рівну 15 мкс.
Регенерація пам'яті, на жаль, "віднімає час" у процесора: кожен цикл регенерації по тривалості займає декілька циклів центрального процесора. Деякі системи дозволяють змінити параметри регенерації за допомогою програми установки параметрів CMOS, але збільшення часу між циклами регенерації може привести до того, що в деяких елементах пам'яті заряд "стече", а це викличе збій пам'яті.
У пристроях DRAM для зберігання одного біта використовується тільки один транзистор і пара конденсаторів, тому вони більш місткі, ніж мікросхеми інших типів пам'яті. Транзистор для кожного однозарядного регістра DRAM використовує для читання стану суміжного конденсатора. Якщо конденсатор заряджений, в осередку записана-1; якщо заряду немає - записаний 0. Розробники DRAM знайшли можливість здійснення передачі даних за допомогою асинхронного інтерфейсу.
З асинхронним інтерфейсом процесор повинен чекати, поки DRAM закінчить виконання своїх внутрішніх операцій, які зазвичай займають близько 60 нс. З синхронним управлінням DRAM відбувається замикання інформації від процесора під управлінням внутрішнього годинника. Тригери запам'ятовують адреси, сигнали управління та даних, що дозволяє процесору виконувати інші завдання. Після певної кількості циклів дані стають доступні, і процесор може зчитувати їх з вихідних ліній.
Інша перевага синхронного інтерфейсу полягає в тому, що системний час задають тільки часові межі, необхідні DRAM. Це виключає необхідність наявності безлічі стробирующих імпульсів. У результаті спрощується введення, тому що контрольні сигнали адреси даних можуть бути збережені без участі процесора і тимчасових затримок. Подібні переваги також реалізовані і в операціях виводу.
До першого покоління високошвидкісних DRAM головним чином відносять EDO DRAM, SDRAM і RDRAM, а до наступного - DDR SDRAM, Direct RDRAM, SLDRAM і т. д.

SDRAM

SDRAM (Synchronous DRAM) - це тип динамічної оперативної пам'яті DRAM, робота якої синхронізується з шиною пам'яті. SDRAM передає інформацію у високошвидкісних пакетах, використовується високошвидкісний синхронізований інтерфейс. SDRAM дозволяє уникнути використання більшості циклів очікування, необхідних при роботі асинхронної DRAM, оскільки сигнали, за якими працює пам'ять такого типу, синхронізовані з тактовим генератором системної плати.

DDR SDRAM (SDRAM II)

DDR SDRAM (Double Data Rate SDRAM) є синхронної пам'яттю, що реалізує подвоєну швидкість передачі даних у порівнянні зі звичайною SDRAM.
DDR SDRAM не має повної сумісності з SDRAM, хоча використовує метод управління, як у SDRAM, і стандартний 168-контактний роз'єм DIMM. DDR SDRAM досягає подвоєною пропускної спроможності за рахунок роботи на обох межах тактового сигналу (на підйомі і спаді), а SDRAM працює тільки на одній.
Direct Rambus DRAM - це високошвидкісна динамічна пам'ять з довільним доступом, розроблена Rambus, Inc. Вона забезпечує високу пропускну здатність у порівнянні з більшістю інших DRAM. Direct Rambus DRAMs представляє інтегровану на системному рівні технологію.

Пам'ять типу SRAM

Існує тип пам'яті, абсолютно відмінний від інших, - статична оперативна пам'ять (Static RAM - SRAM). Вона названа так тому, що, на відміну від динамічної оперативної пам'яті, для збереження її вмісту не вимагається періодичної регенерації. Але це не єдина її перевага. SRAM має більш високу швидкодію ніж динамічна оперативна пам'ять, і може працювати на тій же частоті, що й сучасні процесори.
Час доступу SRAM не більше 2 нс, це означає, що така пам'ять може працювати синхронно з процесорами на частоті 500 МГц або вище. Однак для зберігання кожного біта в конструкції SRAM використовується кластер з 6 транзисторів. Використання транзисторів без будь-яких конденсаторів означає, що немає необхідності в регенерації. Поки подається харчування, SRAM пам'ятатиме те, що збережено.
Мікросхеми SRAM не використовуються для всієї системної пам'яті тому, що в порівнянні з динамічною оперативною пам'яттю швидкодія SRAM набагато вище, але щільність її набагато нижче, а ціна досить висока. Більш низька щільність означає, що мікросхеми SRAM мають великі габарити, хоча їх інформаційна ємкість набагато менше. Велике число транзисторів і кластірізованное їх розміщення не тільки збільшує габарити SRAM, але і значно підвищує вартість технологічного процесу в порівнянні з аналогічними параметрами для мікросхем DRAM.
Всі вище перераховані модулі пам'яті розміщуються в комп'ютері на головній системній платі або на окремих платах пам'яті. Перед обробкою і виведенням на екран дані спочатку вкладаються у пам'ять. Наприклад, файли прикладних програм звичайно розташовуються на жорсткому диску. Коли Ви запускаєте програму, її файли завантажуються в пам'ять для подальшої обробки. Також пам'ять забезпечує тимчасове зберігання даних і прикладних програм. У загальному випадку, чим більше пам'яті встановлено в комп'ютері, тим більше складні прикладні програми можуть виконуватися Вашим комп'ютером. Пам'ять служить для зберігання даних (документів), що обробляються в поточний момент комп'ютером. Виконувана програма, як і значна частина операційної системи DOS, зберігається в оперативній пам'яті. З точки зору внутрішніх механізмів оболонки оперативна пам'ять ділиться на дві частини: основну та розширену. Оперативна пам'ять Вашої системи може бути наступних видів:
- Звичайна або базова пам'ять;
- Додаткова пам'ять;
- Розширена пам'ять;
- Верхня пам'ять.

Базова пам'ять

Операційна система MS DOS, а, отже, і уподібнюються більшість працюють під її управлінням програм можуть використовувати лише перший мегабайт пам'яті, який часто називають базовою пам'яттю. Ця пам'ять в рамках ДОС поділена на дві нерівні частини: перші 640 К (1К = 1024 байт) відводяться для програм користувача і окремих частин самої ДЗГ та називаються стандартною пам'яттю (conventional memory). Для використання стандартної пам'яті не потрібні ніякі додаткові драйвери, оскільки операційна система MS-DOS спочатку створена для роботи в адресах 0-640 Кбайт. Решта 384 До зарезерервіровани для пам'яті відеоадаптерів і ПЗУ і називаються верхнім блоком пам'яті (UMB - Uper Memory Block). У той же час в комп'ютерах IBM AT є можливість адресувати пам'ять об'ємом до 16 Mb, якщо в них використовується мікропроцесор 80286, або до 4 Gb, якщо використовується мікропроцесор 80386 або 80486. Обсяг безпосередньо адресується оперативної пам'яті визначається розрядністю адресної шини мікропроцесора. Мікропроцесори 8088 і 8086 мають 20-розрядну шину, тому адресують 2 в ступені 20 = 1048576 байт = 1 Мb. Мікропроцесор 80286 оснащений 24-розрядною шиною і адресує 2 в ступені 24 = 16 777 216 байт = 16 Mb. 32-розрядна шина 80386 і 80486 мікропроцесорів адресує 2 в ступені 32 = 4294967296 байт = 4Gb.
Додаткова пам'ять
Пам'ять ПК, що залишається за вирахуванням першого мегабайта (тобто за вирахуванням базової пам'яті), називається додаткової (Extended Memory). Додаткова пам'ять є природним доповненням до звичайної (базової) пам'яті комп'ютера, на що і вказує сама її назва. Однак єдиний (але, на жаль, визначає) факт, в якому немає ніякої природності, полягає в тому, що переважній більшості програм MS DOS вона не доступна! Щоб використовувати додаткову пам'ять, процесор комп'ютера повинен працювати в спеціальному режимі, званому захищеним. А операційного система MS DOS не підтримує цього режиму процесора. Таким чином, власник сучасного комп'ютера IBM AT, оснащеного пам'яттю, скажімо, у 8 Mb, часто або взагалі не використовує додаткові 7 Mb, або розміщує в них електронний диск або буферну кеш-пам'ять для дисків. У версії Турбо Паскаля 7.0 (точніше, в пакеті Borland Pascal with Objects 7.0) введена підтримка захищеного режиму мікропроцесорів 80286 / 80386/80486, в якому використовується додаткова пам'ять. Проте ця підтримка не стосується стандартних засобів роботи з додатковою пам'яттю. Проте окремі програми MS DOS застосовують технологію "розширення MS DOS", яка дозволяє їм скористатися перевагами додаткової пам'яті. Прикладом таких програм служать Lotus 1-2-3 (Lotus Development Corporation) і Paradox 386 (Borland International). Комп'ютери ж на базі мікропроцесорів Intel 8086 і 8088 не можуть мати додаткову пам'ять, тому що не мають захищеного режиму. Ці мікропроцесори функціонують виключно в реальному режимі і тому не годяться для роботи з програмами, які використовують додаткову пам'ять. Додаткову пам'ять іноді називають XMS-пам'яті; XMS - скорочення від eXtended Memory Specification (специфікація додаткової пам'яті). Не плутайте цю абревіатуру з іншого - EMS (Expanded Memory
Розширена пам'ять
Ранні IBM-сумісні ПК типу IBM PC / XT оснащувалися мікропроцесорами 8088 чи 8086, здатними працювати з оперативною пам'яттю місткістю не більше 1 Мбайт. Незважаючи на значні розміри цієї пам'яті, у ряді прикладних програм її виявляється недостатній. Такі програми змушені інтенсивно використовувати диск для размезщенія великих обсягів даних, що сильно знижує їх продуктивність. Тому майже одночасно з появою комп'ютерів IBM PC / XT почалися пошуки шляхів підвищення продуктивності великих прикладних проспіваємо (табличних процесорів, систем управління базами даних тощо) за рахунок використання оперативної пам'яті більшого ніж 1 Мбайт розміру. Ці пошуки привели до вироблення угоди між провідними фірмами-розробниками програмно-апаратних засобів, яке відоме як EMS LIM (від Expanded Memory Specification - специфікація розширеної пам'яті, яка задовольняє стандарту фірм Lotus-Intel-Microsoft). Відповідно до цього стандарту ПК оснащуються спеціальними EMS-платами, що містять власне розширену пам'ять мікросхеми, що забезпечують доступ до неї. Пам'ять, організована за принципами специфікації EMS, називається розширеною пам'яттю. На комп'ютерах з мікропроцесорами 80386 і 80486 розширена пам'ять може емулюватися програмно. Починаючи з версії 4.0 операційна система MS DOS поставляється з драйверами розширеної пам'яті XMAEM.SYS і XMA2EMS.SYS. У DOS 5.0 їх функції виконує драйвер EMM386.SYS. Останній на ПК з мікропроцесорами 80386/80486 забезпечує емуляцію розширеної пам'яті, тобто програмно реалізує функції EMS-плати і перетворює додаткову пам'ять в розширену. Крім того, драйвер EMM386.SYS створює блоки верхньої пам'яті (UMB).
Для функціонування драйвера EMM386.SYS потрібно забезпечити підтримку розширеної пам'яті, яку здійснює драйвер HIMEM.SYS. При цьому драйвер HIMEM.SYS повинен бути завантажений до драйвера EMM386.SYS, тому рядок DEVICE = HIMEM.SYS у файлі CONFIG.SYS повинна передувати рядку DEVICE = EMM386.SYS. Таким чином, додаткова пам'ять - це просто додаткова пам'ять. Розширена пам'ять - це спеціальна додаткова пам'ять, що задовольняє вимогам специфікації EMS. Слід зазначити, що терміни "додаткова" і "розширена" пам'ять застосовуються тільки в операційній системі DOS. В інших операційних системах, наприклад, в OS / 2, Unix або Windows NT можна використовувати всю пам'ять комп'ютера. У цих операційних системах пам'ять називається просто "пам'яттю".
Верхня пам'ять
Крім базової, розширеною і додаткової пам'яті, у ПК існує ще так звана верхня пам'ять (не плутайте з верхнім блоком пам'яті!). Як відомо, 20-розрядний адресу при роботі ПК в реальному режимі утворюється шляхом додавання двох 16-розрядних слів - сегмента і зміщення. Перед складанням сегмент зміщується на 4 розряди ліворуч (множиться на 16), що і забезпечує 20-розрядний результат складання - адреса конкретного байта. Формальне складання сегмента і зміщення може призвести до переповнення 20-розрядної адресної сітки. Дійсно, якщо, наприклад, сегмент S = $ FFFF, а зсув O = $ 0010, то складання $ FFFF * 16 + $ 0010 дає значення $ 100000, для представлення якого потрібно вже 21 розряд. Оскільки в ПК застосовується 20-розрядна шина, переповнення результату не може використовуватися, і "зайвий" 21-й розряд просто втрачається, тобто, адресація з сегментом S = $ FFFF та зміщенням O> $ 000F еквівалентна адресації з сегментом S = $ 0000 та зміщенням O = O - $ 0010. В адресній шині IBM AT є 21-й розряд, але його використання звичайно заборонено. Проте в таких комп'ютерах передбачена можливість програмного керування 21-м розрядом. Якщо цей розряд розблокувати, програмі, що працює в реальному режимі процесора, стануть доступні ще майже 64 К (без 16 байт). Ця частина пам'яті і називається верхньою (High Memory Area). MS DOS версії 5.0 і деякі сумісні з нею операційні системи інших фірм (наприклад, DR-DOS фірми Digital Research версії 4.0 і вище) можуть розміщувати у верхній пам'яті свої резидентні частини, тим самим звільняючи дорогоцінну стандартну пам'ять для програм користувача. Таким чином, існують 4 види оперативної пам'яті: • базова - з адресами від $ 00000 до $ FFFFF; • верхня - з адресами від $ 100000 до $ 10FFEF; • дополніпельная - з адресами від $ 100000 до $ FFFFFFFF; • розширена - організовується спеціальними апаратними засобами на комп'ютерах з мікропроцесорами 8088, 8086, 80286 і може програмно емулюватися на процесорах 80386 і 80486.
1.2 Принципи управління та розподілу оперативної пам'яті
Основний ресурс системи, розподілом якого займається ОС - це оперативна пам'ять (ОП). Тому організація пам'яті має великий вплив на структуру і можливості ОС.
Використовувані в операційних системах алгоритми розподілу ВП різноманітні. Причинами цього різноманіття є:
· Багаторівнева структура пам'яті (реєстрова, оперативна, зовнішня)
· Прагнення забезпечити користувача характеристиками, відмінними від реальних (віртуальна пам'ять)
· Необхідність погодження розподілу ОП з розподілом центрального процесора
Найпростіший випадок керування пам'яттю - ситуація, коли диспетчер пам'яті відсутній, і в системі може бути завантажена тільки одна програма. Саме в такому режимі працюють CP / M і RT-11 SJ (Single-Job, однозадачности).
У цих системах програми завантажуються з фіксованого адреси PROG_START . У CP / M це 0x100 ; в RT-11 - 01000 . В адресах від 0 до початку програми знаходяться вектора переривань, а в RT-11 - також і стек програми. У цьому випадку управління пам'яттю з боку системи полягає в тому, що завантажувач перевіряє, чи поміститься завантажений модуль в простір від PROG_START до SYS_START . Якщо обсяг пам'яті, який використовує програма, не буде змінюватися під час її виконання, то на цьому все управління і закінчується.
Однак програма може використовувати динамічне управління пам'яттю, наприклад функцію malloc() . У цьому випадку вже код malloc() повинен стежити за тим, щоб не залізти в системні адреси. Як правило, динамічна пам'ять починає розміщуватися з адреси PROG_END = PROG_START + PROG_SIZE . PROG_SIZE в даному випадку означає повний розмір програми, тобто розмір її коду, статичних даних і області, виділеної під стік.
Функція malloc() підтримує деяку структуру даних, що стежить за тим, які блоки пам'яті з вже виділених були звільнені. При кожному новому запиті вона спочатку шукає блок відповідного розміру у своїй структурі даних і, тільки коли цей пошук завершиться невдачею, відкушує новий блок пам'яті у системи. Для цього використовується змінна, яка в бібліотеці мови C називається brklevel . Спочатку ця змінна дорівнює PROG_END , її значення збільшується при виділенні нових блоків, але в деяких випадках може і зменшуватися. Це відбувається, коли програма звільняє блок, який закінчується на поточному значенні brklevel .
Потреби окремих програм в ресурсі пам'яті в процесі обробки можуть змінюватися, що заздалегідь, до запуску програми, не може бути врахована. У зв'язку з цим необхідно розподіляти пам'ять динамічно безпосередньо в ході обчислювального процесу, тобто здійснювати динамічний розподіл пам'яті.

Алгоритми динамічного упpавления пам'яттю

Динамічний розподіл пам'яті (його ще іноді називають управлінням купою (pool або heap)) являє собою нетривіальну проблему. Дійсно, активне використання функцій malloc/free може призвести до того, що вся доступна пам'ять буде розбита на блоки маленького розміру, і спроба виділення великого блоку завершиться невдачею, навіть якщо сума довжин маленьких блоків набагато більше потрібною. Це явище називається фрагментацією пам'яті. Крім того, велика кількість блоків вимагає тривалого пошуку.
У залежності від розв'язуваної задачі використовуються різні алгоритми пошуку вільних блоків пам'яті. Дійсно, програма може вимагати безліч блоків однакового розміру, або декількох фіксованих розмірів. Це сильно полегшує вирішення проблеми фрагментації і пошуку. Можливі ситуації, коли блоки звільняються в порядку, зворотному тому, в якому вони виділялися. Це дозволяє звести виділення пам'яті до стекової структурі. Можливі ситуації, коли деякі із зайнятих блоків можна перемістити по пам'яті. Так, наприклад, функцію realloc() в ранніх реалізаціях системи UNIX можна було використовувати саме для цієї мети.
У стандартних бібліотеках мов високого рівня, таких як malloc/free/realloc в C, new/dispose в Pascal і т.д., як правило, використовуються алгоритми, розраховані на гірший випадок: програма вимагає блоки випадкового розміру у випадковому порядку та звільняє їх також випадковим чином.
Можливі алгоритми розподілу пам'яті двох типів: коли розмір блоку є характеристикою самого блоку, і коли його повідомляють окремо при звільненні. До першого типу відносяться malloc/free , до другого - GetMem/FreeMem в Turbo Pascal. У першому випадку з кожним блоком асоціюється деякий дескриптор, який містить довжину цього блоку і ще інформацію. Цей дескриптор може зберігатися окремо від блоку, або бути його заголовком. Іноді дескриптор складається з двох міток - на початку блоку і в його кінці. Для чого це може бути корисно, буде розказано нижче.
Зазвичай всі вільні блоки пам'яті об'єднуються в двонаправлений зв'язаний список. Список повинен бути двонаправленим для того, щоб з нього в будь-який момент можна було витягти будь-який блок. Втім, якщо всі дії з вилучення блоку проводяться після пошуку, то можна злегка ускладнити пpоцедуpу пошуку і завжди зберігати покажчик на пpедидущій блок. Це pешает пpоблему вилучення і можна огpанічіться однонапpавленним списком. Біда тільки в тому, що багато алгоpитма пpи об'єднання вільних блоків витягують їх із списку у відповідності з адpесов, тому для таких алгоpитма двунапpавленний список необхідний.
Пошук в списку може вестися двома способами: до знаходження першого відповідного (first fit) блоку або до блоку, розмір якого ближче всього до заданого - найбільш відповідного (best fit). Для знаходження найбільш підходящого ми зобов'язані переглядати весь список, в той час як перший підходящий може опинитися в будь-якому місці, і середній час пошуку буде менше.
Крім того, в загальному випадку best fit збільшує фрагментацію пам'яті. Дійсно, якщо ми знайшли блок з розміром більше заданого, ми повинні відокремити «хвіст» і позначити його як новий вільний блок. Зрозуміло, що в разі best fit середній розмір цього хвоста буде маленьким, і ми в результаті отримаємо велику кількість дрібних блоків, які неможливо об'єднати, тому що простір між ними зайнято.
При використанні first fit з лінійним двонаправленим списком виникає специфічна проблема. Якщо кожного разу переглядати список з одного і того ж місця, то великі блоки, розташовані ближче до початку, будуть частіше віддалятися. Відповідно, дрібні блоки будуть мати тенденцію скупчуватися на початку списку, що збільшить середній час пошуку. Простий спосіб боротьби з цим явищем полягає в тому, щоб переглядати список то в одному напрямку, то в іншому. Більш радикальний і ще більш простий метод полягає в тому, що список робиться кільцевим, і пошук кожен починається з того місця, де ми зупинилися минулого разу. У це ж місце додаються звільнилися блоки.
У ситуаціях, коли розміщуються блоки декількох фіксованих розмірів, алгоритми best fit виявляються краще. Однак бібліотеки розподілу пам'яті розраховують на гірший випадок, і в них зазвичай використовуються алгоритми first fit.
У випадку роботи з блоками декількох фіксованих розмірів напрошується таке рішення: створити для кожного типорозміру свій список.
Цікавий варіант цього підходу для випадку, коли різні розміри є ступенями числа 2, як 512 байт, 1Кбайт, 2Кбайта і т.д., називається алгоритмом близнюків. Він полягає в тому, що ми шукаємо блок необхідного розміру у відповідному списку. Якщо цей список порожній, ми беремо список блоків вдвічі більшого розміру. Отримавши блок більшого розміру, ми ділимо його навпіл. Непотрібну половину ми поміщаємо у відповідний список вільних блоків. Одна з переваг цього методу полягає в простоті об'єднання блоків при їх звільненні. Дійсно, адресу блоку-близнюка виходить простим інвертуванням відповідного біта в адресі нашого блоку. Потрібно тільки перевірити, чи вільний цей близнюк. Якщо він вільний, то ми об'єднуємо братів у блок вдвічі більшого розміру, і т.д.
Алгоритм близнюків значно знижує фрагментацію пам'яті і різко прискорює пошук блоків. Найбільш важливою перевагою цього підходу є те, що навіть у найгіршому випадку час пошуку не перевищує. Це робить алгоритм близнюків труднозаменімим для ситуацій, коли необхідно гарантований час реакції - наприклад, для задач реального часу. Часто цей алгоритм або його варіанти використовуються для виділення пам'яті всередині ядра ОС. Наприклад, функція kmalloc , використовувана в ядрі ОС Linux, заснована саме на алгоритмі близнюків.
Розробник програми динамічного розподілу пам'яті зобов'язаний вирішити ще одну важливу проблему, а саме - об'єднання вільних блоків. Найкращим з відомих універсальних алгоритмів динамічного розподілу пам'яті є алгоритм парних міток з об'єднанням вільних блоків в двонаправлений кільцевої список і пошуком за принципом first fit. Цей алгоритм забезпечує прийнятну продуктивність майже для всіх стратегій розподілу пам'яті, використовуваних в прикладних програмах. Такий алгоритм використовується практично у всіх реалізаціях стандартної бібліотеки мови C і в багатьох інших ситуаціях. Інші відомі алгоритми або просто гірше, ніж цей, або проявляють свої переваги лише в спеціальних випадках.
До основних недоліків цього алгоритму відноситься відсутність верхньої межі часу пошуку відповідного блоку, що робить його неприйнятним для задач реального часу.
Деякі системи програмування використовують спеціальний метод звільнення динамічної пам'яті, званий складанням сміття. Цей метод полягає в тому, що непотрібні блоки пам'яті не звільняються явним чином. Замість цього використовується певний більш-менш витончений алгоритм, що стежить за тим, які блоки ще потрібні, а які - вже немає.
Найпростіший метод-відрізняти використовувані блоки від непотрібних - вважати, що блок, на який є посилання, потрібен, а блок, на який жодного посилання не залишилося - не потрібний. Для цього до кожного блоку приєднують дескриптор, в якому підраховують кількість посилань на нього. Кожна передача покажчика на цей блок призводить до збільшення лічильника посилань на 1, а кожне знищення об'єкта, що містив покажчик - до зменшення.
Всі інші методи збирання сміття так чи інакше зводяться до підтримки бази даних про те, які об'єкти на кого посилається. Використання такої техніки можливо практично тільки в інтерпретованих мовах типу Lisp або Prolog, де з кожною операцією можна асоціювати необмежено велику кількість дій.
Багатозадачна або багатопрограмна ОС також повинні використовувати той чи інший алгоритм розміщення пам'яті. Такі алгоритми можуть бути схожі на роботу malloc. Проте режим роботи ОС може вносити істотні спрощення в алгоритм.
Так, наприклад, пpоцедуpу управління пам'яттю MS DOS розрахована на випадок, коли програми вивантажуються з пам'яті тільки в порядку, зворотному тому, в якому вони туди завантажувалися. Це дозволяє звести управління пам'яттю до стекової дисципліни.
Кожній програмі в MS DOS відводиться блок пам'яті. З кожним таким блоком асоційований дескриптор, званий MCB - Memory Control Block. Цей дескриптор містить розмір блоку, ідентифікатор програми, якій належить цей блок і ознака того, чи є даний блок останнім у ланцюжку. Потрібно відзначити, що програмі завжди належить кілька блоків, але це вже несуттєві деталі. Інша малоістотно деталь та, що розмір сегментів і їх адреси відраховують в параграфах розміром 16 байт. Після запуску. com -файл отримує сегмент розміром 64К, а. exe - всю доступну пам'ять. Зазвичай. exe -модулі відразу після запуску звільняють непотрібну їм пам'ять і встановлюють brklevel на кінець свого сегменту, а потім збільшують brklevel і нарощують сегмент в міру необхідності. Природно, що нарощувати сегмент можна тільки за рахунок наступного за ним у ланцюжку MCB , і MS DOS дозволить робити це тільки у випадку, якщо цей сегмент не належить ніякої програмі.
При запуску програми DOS бере останній сегмент в ланцюжку, і завантажує туди програму, якщо цей сегмент досить великий. Якщо він недостатньо великий, DOS «говорить» Not enough memory і відмовляється завантажувати програму.
При завершенні програми DOS звільняє всі блоки, які належали програмі. При цьому сусідні блоки поєднуються. Поки програми, дійсно, завершуються в порядку, зворотному тому, в якому вони запускали, - все цілком нормально. Інша справа, що в реальному житті можливі відхилення від цієї схеми.
Наприклад, неявно передбачається, що TSR -програми (Terminate, but Stay Resident) ніколи не намагаються завершитися. Інший приклад - відладчики зазвичай завантажують програму в обхід звичайної DOS-івської функції LOAD & EXECUTE , а при завершенні відладжується програми самі звільняють пам'ять з-під неї.
У системах з динамічною складанням перші дві проблеми не так гострі, тому що пам'ять виділяється та звільняється невеликими шматочками, по блоку на кожен об'єктний модуль, тому код програми зазвичай не займає безперервного простору. Відповідно, такі системи часто дозволяють і даними програми займати несуміжні області пам'яті.
Для досягнення гнучкого динамічного розподілу пам'яті, усунення її фрагментації, а також створення значних зручностей для програмування в сучасних ОС широко використовується віртуальна пам'ять. При цьому на всіх етапах підготовки програм, включаючи завантаження в оперативну пам'ять, програма представляється у віртуальних адреси і лише при самому виконанні машиною команди виробляється перетворення віртуальних адрес в адреси діючої пам'яті (у так звані фізичні адреси). Це перетворення становить зміст динамічного розподілу пам'яті.
Обсяг віртуального адресного простору може навіть перевершувати всю доступну реальну пам'ять на ЕОМ. Вміст віртуальної пам'яті, невикористовуваної програмою, зберігається на деякому зовнішньому пристрої (зовнішньої пам'яті). За необхідності частини цієї віртуальної пам'яті відображаються в реальну пам'ять. Ні про зовнішньої пам'яті, ні про її відображенні в реальну пам'ять програма нічого не знає. Вона написана так, як ніби-то віртуальна пам'ять існує в дійсності (рис. 2.).

Рис.3.3 Основна концепція віртуальної пам'яті
Рис.2. Основна концепція віртуальної пам'яті
При сторінковій організації основна пам'ять ділиться на блоки фіксованого розміру, зазвичай звані рамка сторінок. Кожна програма користувача ділиться на блоки сответствующій розміру, звані сторінками. Сторінки організовуються в логічному адресному просторі, а рамки сторінка - у фізичному. Оскільки сторінки і рамки сторінок мають різні ідентифікатори, виникають цікаві ситуації, що стосуються взаємозв'язку між логічним адресним простором (лап) та фізичним адресним простором ФАП).
1. Лап <ФАП. У цьому випадку основний акцент робиться на підвищення ефективності використання пам'яті.
2. Лап = ФАП. Сторінкова організація служить не тільки для збільшення ефективності використання пам'яті, але і для розширення можливості розділеного використання процедур (тобто декількома користувачами). Можливе використання ефективного оверлейного механізму, реалізованого апаратно.
3. Лап> ФАП. Цей випадок передбачає віртуальну пам'ять і дає найбільші переваги.
Ми будемо розглядати управління сторінками стосовно до останнього випадку. Вибір між випадками 1 і 2 зазвичай знаходиться в залежності від структури Пристрої Управління Пам'яттю (УУП) та завдань проектувальника операційної системи. Користувач, маючи в своєму розпорядженні лап з m сторінок, буде мати k сторінок, відведених під інтерпретатор, і m - k сторінок робочого простору. Описаний підхід ефективний для системи з поділом часу.
Ідентифікація. Сторінки і рамки сторінок з набжают числовими ідентифікаторами, встановленими за наступним правилом.
Нехай p є розмір сторінки в словах (наприклад, 512).
Нехай т є розмір основної пам'яті в словах, такий, що m = n * p по модулю 1024 є 0; р по модулю 2К є 0 і i * p = j * 1024. Таким чином, основна пам'ять складається з ділянок по 1К слів в кожному. Крім цього, розмір сторінки є ступінь числа 2, а 1К пам'яті містить парне число сторінок. Набір цілих чисел 0, 1, 2 ,..., п-1 відповідає ідентифікаторах сторінкових рамок.
Нехай М є розмір програми користувача в словах. Для розміщення цієї програми в пам'яті необхідно N сторінок, так що М = N * p. Набір цілих чисел від 0 до п-1 відповідає ідентифікаторів сторінок користувача. Зауважимо, що вимога рівності нулю m за модулем р не є обов'язковим. Це означає, що програма користувача не повинна заповнювати цілком всі сторінки. Остання сторінка може бути заповнена лише частково.
Використовуючи двійкову арифметику, - представлення сторінки ступенем числа 2 легко піддається реалізації. Фактично в більшості машин є команди зсуву, що роблять генерацію віртуального адреси дуже простою операцією. Вимога завдання М кратним 1К є результатом стандартизації. Останнім часом прийнято вважати, що розмір 8К, 16К і навіть 64К більш кращий.
Конструкція віртуального адреси. Віртуальний адреса - це адреса логічного простору процесу користувача (зазвичай для випадку лап> ФАП). Всі посилання до логічного простору повинні бути перетворені у фізичну адресу основної пам'яті. Для цього системі необхідні ідентифікатор рамки сторінки і зміщення всередині неї. Система повинна перетворити віртуальний адреса в фізичний. Кожен віртуальний адреса є пара (р, i), де р - номер сторінки процесу користувача, а i-індекс сторінки (такий, що i <w, де w-розмір сторінки).
Припустимо, що машина має 16-біт слово, що дозволяє їй адресуватися до 64К слів. Якщо розмір сторінки складе 512 слів, то логічний адресний простір буде складатися з 128 сторінок. Для ідентифікатора р необхідно 7 біт, а для індексу 9 біт. Повний 16-біт слово буде мати вигляд
Ідентифікатор - сторінки
Індекс - слова
Зазначимо, що випадок лап <ФАП можливий, якщо пристрій управління пам'яттю забезпечує розмір слова, більший ніж 18 біт. На ЕОМ серії PDP-11/70 лап кожного користувача обмежено 64К байт, в той час як УУП підтримує 128К слів. У ЕОМ серії VAX-11/780 фірми DEC адресний простір кожного користувача становить 2 32, а максимальний фізичний розмір основної пам'яті може досягати 16М байт. У ЕОМ серії VAX-11/780 використовується 32-біт слово, що має наступну конструкцію:
31
30
Вид віртуальної
Сторінки
Байт в
сторінці
де біти 31 і 30 мають спеціальне призначення для; VAX / VMS; біти 29 - 9 адресуються до однієї з 2 20 сторінок; біти 7 - 0 вибирають один із 512 байт в сторінці.
На ЕОМ, що має 16-біт розмір слова, великий віртуальний адреса може бути складений з двох слів. Він може мати, наприклад, такий вигляд:
Номер
сторінки
Байт в
сторінці
Роль таблиці сторінок. Одним з достоїнств сторінкової організації є динамічний розподіл сторінок користувача в будь-якому місці пам'яті. Так, сторінка Р процесу
Рис. 1
Рис. 3.Отображеніе сторінки на основну пам'ять.
Віртуальний адресу = (р, i). Фізична адреса - x = розмір сторінки + i. Негативне значення ідентифікатора рамки сторінки вказує на те, що сторінка в даний момент відсутній в пам'яті
користувача може в деякий момент займати сторінкову рамку р у фізичній пам'яті. Оскільки у кожного з користувачів є свій набір сторінок, кожній програмі необхідна карта, яка відображає взаємозв'язок між сторінками і рамками сторінок. На рис. 1 віртуальний адреса (p, i) перетворюється у фізичний, пошуком в таблиці сторінок ідентифікатора х для рамки сторінки. Реальний адресу утворюється множенням х на розмір сторінки і додаванням до отриманого результату індексу i.
Важливо відзначити, що ці операції здійснюються УУП узгоджено з програмою користувача. Для цього копія таблиці сторінок процесу повинна бути завантажена в УУП.
Рис. 2
Рис. 3. Узагальнена процедура сторінкового обміну. Блок # - це адреса рамки сторінки в основній пам'яті (тому множення на розмір сторінки не потрібно).
Наприклад, припустимо, що УУП розпорядженні простору для 16 карт пам'яті, а кожна карта пам'яті містить поля (елементи) для 64 сторінок по 512 слів у кожній. Карта з номером 0 завжди належить ядру операційної системи. Такий підхід не може бути реалізований для систем з великим об'ємом віртуальної пам'яті, тому що вартість УУП буде надмірно великий. У цьому випадку картка залишається в основній пам'яті, а УУП управляє поточної картою користувача за допомогою покажчиків. На рис.2 наведена структура, що відповідає такій схемі.
За цією схемою УУП підтримує список адрес таблиць для n користувачів. Апаратно реалізований регістр служить для вказівки поточного користувача, тобто користувача, чия таблиця сторінок є в даний момент активною. Елемент таблиці, що містить карту користувача (у УУП), завантажується в апаратний регістр бази таблиці сторінок. Кожен адреса пам'яті містить ідентифікатор сторінки та індекс. Ідентифікатор сторінки в комбінації з вмістом базового регістра таблиці сторінок вказує на елемент таблиці сторінок. Вмістом цього елемента є адреса рамки сторінки в пам'яті. Додаючи індекс до адресою рамки сторінки, ми отримуємо фізичну адресу.
Відзначимо, що при такій схемі кожне посилання таблиці сторінок вимагає додаткового доступу до пам'яті для вилучення адреси рамки сторінки. У попередньому випадку всі обчислення грунтувалися на використанні апаратних регістрів УУП. Таким чином, застосування віртуальної пам'яті великого обсягу може призвести до тимчасових затримок у системі і збільшення загального часу роботи програми. Розробник системи повинен враховувати ці фактори при виборі способу управління пам'яттю на етапі проектування системи.
Контрольні біти сторінок. З кожним елементом таблиці зв'язується набір контрольних бітів. Ці біти служать для вказівки стратегії управління сторінками. Кількість і тип цих бітів визначаються застосованим УУП. Біти, наведені нижче, характерні для апаратної частини більшості систем.
1. БІТ-ПРИСУТНОСТІ вказує, чи знаходиться сторінка в даний момент в основній пам'яті.
2. БІТ (И)-АКТИВНОСТІ вказує на використання за останній час даної сторінки процедурами сторінкового обміну.
3. БІТ-ЗМІНИ вказує на те, що вміст сторінки пам'яті змінювалося (або не змінювалося) з моменту її завантаження в пам'ять.
Біт присутності аналізується при кожній адресної посиланням програми користувача. Рівність його нулю означає, що сторінка була видалена з пам'яті. Біт зміни визначає необхідність запису сторінки на диск при її заміні в пам'яті. Одиничне його значення означає, що у вмісті сторінки були зроблені зміни, і, отже, вона повинна бути записана на диск. (Нульове значення припускає використання колишньої копії.) У системах, в яких сторінки інструкцій (на противагу сторінок даних) є реєнтерабельним, біт зміни ніколи не встановлюється.

2. Розробка алгоритму керування оперативною пам'яттю
Нижче наведено алгоритм управління оперативною пам'яттю в системі Linux. В основі всього лежать сторінки пам'яті. У ядрі вони описуються структурою mem_map_t.
typedef struct page {
/ * These must be first (free area handling) * /
struct page * next;
struct page * divv;
struct inode * inode;
unsigned long offset;
struct page * next_hash;
atomic_t count;
unsigned long flags; / * atomic flags, some possibly updated asynchronously * /
struct wait_queue * wait;
struct page ** pdivv_hash;
struct buffer_head * buffers;
} Mem_map_t;
У системі застосовується безліч посилань, які в свою чергу використовуються для управління ОП. Одна сторінка може знаходитися в різних списках, наприклад і в списку сторінок в сторінковому кеші і в списку сторінок відносяться до відображеного в пам'ять файлу (inode). У структурі, яка описує останній, можна знайти і зворотне посилання, що дуже зручно.
Всі сторінки адресуються глобальним покажчиком mem_map
mem_map_t * mem_map
Адресація відбувається найбільш интерестно. Якщо раніше (у ранніх версіях ядра) в структурі page було окреме поле вказує на фізичну адресу (map_nr), то тепер він обчислюється. Алгоритм обчислення можна виявити в такій функції ядра.
static inline unsigned long page_address (struct page * page)
{
return PAGE_OFFSET + PAGE_SIZE * (page - mem_map);
}
Вільні сторінки зберігаються в особливій структурі free_area
static struct free_area_struct free_area [NR_MEM_TYPES] [NR_MEM_LISTS];
де перше поле відповідає за тип області: Ядра, Користувача, DMA і т.д. І обробляються по дуже цікавому алгоритму.
Сторінки діляться на вільні безперервні області розміру 2 у ступені x помноженої на розмір сторінки ((2 ^ x) * PAGE_SIZE). Області одного розміру лежать в одній області масиву.
Таблиця 1.
Вільні Сторінки розміру PAGE_SIZE * 4 --->
список вільних областей
Вільні Сторінки розміру PAGE_SIZE * 2 --->
список вільних областей
Вільні Сторінки розміру PAGE_SIZE --->
список вільних областей
Виділення стараніци виконується функцією get_free_pages (order). Вона виділяє сторінки складові область розміру PAGE_SIZE * (2 ^ order). Робиться це в такий спосіб: шукається область відповідного розміру або більше. Якщо є тільки область більшого розміру, то вона ділиться на декілька маленьких і береться потрібний шматок. Якщо вільних сторінок недостатньо, то деякі будуть скинуті в область підкачки і процес виділення почнеться знову. Повертає сторінку функція free_pages (struct page, order). Вивільняє сторінки, що починаються з page розміру PAGE_SIZE * (2 ^ order). Область повертається в масив вільних областей у відповідну позицію і після цього відбувається спроба об'єднати кілька областей для створення однієї більшого розміру.
Відсутність сторінки в пам'яті обробляються ядром особливо. Сторінка може або взагалі відсутні або знаходитися в області підкачки.
Весь процес працює з віртуальними адресами, а не з фізичними. Перетворення відбувається за допомогою обчислень, використовуючи таблиці дескрипторів, і каталоги таблиць. Linux підтримує 3 рівня таблиць: каталог таблиць першого рівня (PGD - Page Table Directory), каталог таблиць другого рівня (PMD - Medium Page Table Diractory), і, таблиця дескрипторів (PTE - Page Table Entry). Конкретним процесором можуть підтримуватися не всі рівні, але запас дозволяє підтримувати більше можливих архітектур (Intel має 2 рівні таблиць, а Alpha - цілих 3). Перетворення віртуальної адреси у фізичний відбувається відповідно в 3 етапи. Береться покажчик PGD, наявний у структурі описує кожен процес, перетвориться в покажчик запису PMD, а останній перетвориться в покажчик у таблиці дескрипторів PTE. І, нарешті, до реального адресою, яка вказує на початок сторінки додають зсув від її початку. Хороший приклад подібної процедури можна подивитися у функції ядра partial_clear:
page_dir = pgd_offset (vma-> vm_mm, address);
if (pgd_none (* page_dir))
return;
if (pgd_bad (* page_dir)) {
printk ("bad page table directory entry% p: [% lx] \ n", page_dir, pgd_val (* page_dir));
pgd_clear (page_dir);
return;
}
page_middle = pmd_offset (page_dir, address);
if (pmd_none (* page_middle))
return;
if (pmd_bad (* page_middle)) {
printk ("bad page table directory entry% p: [% lx] \ n", page_dir, pgd_val (* page_dir));
pmd_clear (page_middle);
return;
}
page_table = pte_offset (page_middle, address);
Всі дані про використовувану процесом пам'яті поміщаються в структурі: mm_struct
struct mm_struct {
struct vm_area_struct * mmap; / * Список відображених областей * /
struct vm_area_struct * mmap_avl; / * Ті ж області але вже у вигляді дерева
для більш швидкого пошуку * /
struct vm_area_struct * mmap_cache; / * Остання знайдена область * /
pgd_t * pgd; / * Каталог таблиць * /
atomic_t count;
int map_count; / * Кількість областей * /
struct semaphore mmap_sem;
unsigned long context;
unsigned long start_code, end_code, start_data, end_data;
unsigned long start_brk, brk, start_stack;
unsigned long arg_start, arg_end, env_start, env_end;
unsigned long rss, total_vm, locked_vm;
unsigned long def_flags;
unsigned long cpu_vm_mask;
unsigned long swap_cnt; / * кількість сторінок для свопінгу при наступному проході * /
unsigned long swap_address;
/ *
* Це архітектурно-залежний покажчик. Стерпна частина Linux
нічого не знає про сегменти. * /
void * segments;
};
Зауважуємо, що крім цілком зрозумілих покажчиків на початок даних (start_code, end_code ...) коду і стека є покажчики на дані відображених файлів (mmap).
На рівні процесу робота може вестися як із сторінками безпосередньо, так і через абстрактну структуру vm_area_struct
struct vm_area_struct {
struct mm_struct * vm_mm; / * параметри області віртуальної пам'яті * /
unsigned long vm_start;
unsigned long vm_end;
/ * Пов'язується список областей завдання відсортований за адресами * /
struct vm_area_struct * vm_next;
pgprot_t vm_page_prot;
unsigned short vm_flags;
/ * AVL-дерево областей, для прискореного пошуку, сортування за адресами * /
short vm_avl_height;
struct vm_area_struct * vm_avl_left;
struct vm_area_struct * vm_avl_right;
/ * Для областей використовуваних при відображенні файлів або при роботі
з пам'яті, що розділяється, інакше ця частина структури не використовується * /
struct vm_area_struct * vm_next_share;
struct vm_area_struct ** vm_pdivv_share;
struct vm_operations_struct * vm_ops; / * операції над областю * /
unsigned long vm_offset;
struct file * vm_file;
unsigned long vm_pte; / * колективна пам'ять * /
};
struct vm_operations_struct {
void (* open) (struct vm_area_struct * area);
void (* close) (struct vm_area_struct * area);
void (* unmap) (struct vm_area_struct * area, unsigned long, size_t);
void (* protect) (struct vm_area_struct * area, unsigned long, size_t, unsigned int newprot);
int (* sync) (struct vm_area_struct * area, unsigned long, size_t, unsigned int flags);
void (* advise) (struct vm_area_struct * area, unsigned long, size_t, unsigned int advise);
unsigned long (* nopage) (struct vm_area_struct * area, unsigned long address, int write_access);
unsigned long (* wppage) (struct vm_area_struct * area, unsigned long address,
unsigned long page);
int (* swapout) (struct vm_area_struct *, struct page *);
pte_t (* swapin) (struct vm_area_struct *, unsigned long, unsigned long);
};
Дана структура виникла з ідеї віртуальної файлової системи, тому всі операції над віртуальними областями абстрактні і можуть бути специфічними для різних типів пам'яті, наприклад при відображенні файлів операції читання одні, а при відображенні пам'яті (через файл / dev / mem) зовсім інші. Спочатку vm_area_struct з'явилася для забезпечення потреб відображення, але поступово поширюється і для інших цілей.
Що робити, коли потрібно отримати нову область пам'яті. Є цілих 3 способи.
1. get_free_page ()
2. kmalloc - Простенька (за можливостями) процедура з великими обмеженнями по виділенню нових областей і за їх розміром.
3. vmalloc - Потужна процедура, яка працює з віртуальною пам'яттю, може виділяти великі обсяги пам'яті.
З кожною з двох процедур у ядрі пов'язані ще за списком вільних / зайнятих областей, що ще більше ускладнює розуміння роботи з пам'яттю. (Vmlist для vmalloc, kmem_cash для kmalloc)
Додана підтримка нової архітектури пам'яті NUMA. На противагу класичної UMA пам'ять ділиться на зони з різним часом доступу до кожної з них. Це дуже корисно і для кластерних рішень. У зв'язку з цим з'явилися нові обгортки на функції, нові структури і знайти суть стало ще складніше. З'явилася також підтримка пам'яті до 64Гб.
Раніше для всіх файлових систем був один generic_file_read і generic_file_mmap у зв'язку з тотальним засмоктуванням усього підряд у пам'ять при читанні (розходження робилися вже тільки на рівні inode-> readpage).

Висновок.
У процесі виконання курсової роботи, було виконано вивчення параметрів, характеристик оперативної пам'яті. Також були вивчені види, типи, структури і алгоритми управління оперативною пам'яттю. Далі був наданий приклад роботи операційної системи Linux з оперативною пам'яттю.

Список використаної літератури
1. Ріхтер Джеффрі "Linux для професіоналів", С-П. Російська редакція 1998.
2. Хендерсон К. "Керівництво розробника баз даних"
3. Г. Маєрс "Надійність ВО" Світ, М., 1980
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
98.7кб. | скачати


Схожі роботи:
Управління пам`яттю
Засоби апаратної підтримки управління пам`яттю в мікропроцесорах Intel 80386 80486 і Pentium
Управління пам яттю в МS-DOS Описані основні ф-ції управління памяттю в ОС Ms-Dos
Синтез автоматів з пам яттю
Коди без пам`яті Коди Хаффмена Коди з пам`яттю
Взаємозв`язок розвитку мислення з пам`яттю і мовою у дітей молодшого шкільного віку
Наказова система управління Пам`ятники давньоруського права Військовий артикул Петра I
Пам`ятні місця і пам`ятники Смоленщини присвячені Великій Вітчизняній війні
Види пам`яті витісняють статичну пам`ять
© Усі права захищені
написати до нас